package com.fzk.blog.utils;


import com.fzk.blog.exception.MyException;

/**
 * @author fzk
 * @date 2021-07-15 17:14
 * <p>
 * 工具类：用于对数据库中decimal(9,2)字段进行格式处理，使得java中的数值能转为对于需要格式的String
 */
public class MyDecimalUtil {
    /**
     * 将传入的value格式化为两位小数的字符串
     *
     * @param value 需要传入一个纯数字字符串
     * @return 传入为空串或null或超过一个小数点都将返回null，其他情况返回格式化后的字符串
     */
    public static String format(String value) {
        try {
            if (value == null)
                return null;
            if (value.equals(""))
                return null;
            if (!value.contains(".")) {//没有小数，直接加上两位小数即可
                int i = Integer.parseInt(value);//这里是尝试能不能解析，不能解析会报错
                return i + ".00";
            }

            String[] split = value.split("\\.");
            if (split.length != 2)// 说明小数点不止1位
                return null;

            Integer.parseInt(split[0]+split[1]);//尝试直接转换为整数，检查是否报错

            // 小数点前没有数字，补0
            if (split[0].length() == 0) split[0] = "0";

            // 小数点后没有值，加2个0即可
            if (split[1].length() == 0) return split[0] + ".00";
            // 1位小数，加1个0
            else if (split[1].length() == 1) return split[0] + "." + split[1] + "0";
                // 2位小数或更多，截断
            else return split[0] + "." + split[1].substring(0, 2);

        } catch (Exception e) {
            throw new MyException(500, "参数：" + value + "   格式转化错误：" + e.getMessage());
        }
    }

    /**
     * 将传入的两个纯数字字符串进行相加，返回格式化字符串
     *
     * @param val1 格式化值
     * @param val2 格式化值
     * @return 返回小数点后有两位的字符串
     */
    public static String add(String val1, String val2) {
        return addOrMinus(val1, val2, true);
    }

    /**
     * 第一个参数减去第二个参数，返回两位小数字符串
     *
     * @param val1 纯数字字符串
     * @param val2 纯数字字符串
     * @return 返回相减的带两位小数的字符串
     */
    public static String minus(String val1, String val2) {
        return addOrMinus(val1, val2, false);
    }


    /**
     * @param isAdd true为加，false为减
     */
    private static String addOrMinus(String val1, String val2, boolean isAdd) {
        // 先格式化
        String format1 = format(val1);
        String format2 = format(val2);

//        System.out.println(format1+" : "+format2);

        if (format1 == null || format2 == null)
            return null;

        String[] split1 = format1.split("\\.");
        String[] split2 = format2.split("\\.");

        String str1 = split1[0] + split1[1];
        String str2 = split2[0] + split2[1];
        int resultInt;
        if (isAdd)
            resultInt = Integer.parseInt(str1) + Integer.parseInt(str2);
        else
            resultInt = Integer.parseInt(str1) - Integer.parseInt(str2);

        return returnFormat(resultInt);
    }

    private static String returnFormat(int resultInt) {
        String resultStr;
        int abs = Math.abs(resultInt);
        if (abs < 10) {// 即0~9
            if (resultInt < 0)// 即负数
                resultStr = "-0.0" + abs;
            else
                resultStr = "0.0" + abs;
        } else if (abs < 100) {// 即10~99
            if (resultInt < 0)// 负数
                resultStr = "-0." + abs;
            else
                resultStr = "0." + abs;
        } else {// 即>=100，后两位保留做小数
            if (resultInt < 0)// 负数
                resultStr = "-" + abs / 100 + "." + returnFormat(abs % 100).substring(2, 4);
            else
                resultStr = abs / 100 + "." + returnFormat(abs % 100).substring(2, 4);
        }
        return resultStr;
    }

}
